<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>Kotlin 技术月报 | 2024 年 6 月 | 北京 KUG</title><meta name=keywords content="技术月报"><meta name=description content="为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。
月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。
最新动态 KotlinConf 分享回放已全部发布 All KotlinConf Recordings Are Now Available. Enjoy!
现在，您可以在 KotlinConf 官方网站上找到 KotlinConf’24 的所有回放：https://kotlinconf.com/talks/
Kotlin 2.0.20-Beta1 版本已发布 Kotlin 2.0.20-Beta1 版本已发布，更新内容也主要是一些 bug 修复：https://github.com/JetBrains/kotlin/releases
你可能会好奇，为什么 2.0.10 还没有发布就发布了 Kotlin 2.0.20-Beta1? 还会有 2.0.10 吗?
自 Kotlin 2.0.0 起，Jetbrains 发布以下类型的版本：
语言版本（2.x.0），带来语言的重大变化并包括工具更新。每6个月发布一次。 工具版本（2.x.20），在语言版本之间发布，包括工具更新、性能改进和错误修复。在相应的语言版本发布后3个月发布。 错误修复版本（2.x.yz），包括针对工具版本的错误修复。这些版本没有确切的发布时间表。 对于每个语言和工具版本，Jetbrains 还会发布几个预览（EAP）版本，供您在正式发布之前尝试新功能。因此不必担心，Kotlin 2.0.10 版本将随后发布。
精选博客 采用 Kotlin Multiplatform 做跨平台 KMP 作为跨平台框架，到底有没有技术生命力，是否要选择它来作为自己未来的发展方向？本文借鉴左耳朵耗子在“如何选择技术”中提出的观点来考虑：
Kotlin Symbol Processing使用与原理剖析 Kotlin Symbol Processing (KSP) 是一个可用于开发轻量级编译器插件的API，与Kotlin Annotation Processing Tool（KAPT）相似，但是却可以更高效地处理注解，并提供更好的性能，使用 KSP 的注释处理器的运行速度最多可达两倍，而且可以支持多平台。
本文详细介绍了 KSP 的使用与从 Kapt 迁移过来的步骤，具体包括如下内容："><meta name=author content="beijing-kug"><link rel=canonical href=https://beijing-kug.github.io/news/kotlin-news-2024-06/><link crossorigin=anonymous href=/assets/css/stylesheet.8f39c56ff9c568320c772f590aacdf29f8e8f17c0d9623de1a80621f8b933a96.css integrity="sha256-jznFb/nFaDIMdy9ZCqzfKfjo8XwNliPeGoBiH4uTOpY=" rel="preload stylesheet" as=style><script defer crossorigin=anonymous src=/assets/js/highlight.f413e19d0714851f6474e7ee9632408e58ac146fbdbe62747134bea2fa3415e0.js integrity="sha256-9BPhnQcUhR9kdOfuljJAjlisFG+9vmJ0cTS+ovo0FeA=" onload=hljs.initHighlightingOnLoad()></script>
<link rel=icon href=https://beijing-kug.github.io/kug-logo.png><link rel=icon type=image/png sizes=16x16 href=https://beijing-kug.github.io/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=https://beijing-kug.github.io/favicon-32x32.png><link rel=apple-touch-icon href=https://beijing-kug.github.io/apple-touch-icon.png><link rel=mask-icon href=https://beijing-kug.github.io/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--hljs-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><meta property="og:title" content="Kotlin 技术月报 | 2024 年 6 月"><meta property="og:description" content="为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。
月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。
最新动态 KotlinConf 分享回放已全部发布 All KotlinConf Recordings Are Now Available. Enjoy!
现在，您可以在 KotlinConf 官方网站上找到 KotlinConf’24 的所有回放：https://kotlinconf.com/talks/
Kotlin 2.0.20-Beta1 版本已发布 Kotlin 2.0.20-Beta1 版本已发布，更新内容也主要是一些 bug 修复：https://github.com/JetBrains/kotlin/releases
你可能会好奇，为什么 2.0.10 还没有发布就发布了 Kotlin 2.0.20-Beta1? 还会有 2.0.10 吗?
自 Kotlin 2.0.0 起，Jetbrains 发布以下类型的版本：
语言版本（2.x.0），带来语言的重大变化并包括工具更新。每6个月发布一次。 工具版本（2.x.20），在语言版本之间发布，包括工具更新、性能改进和错误修复。在相应的语言版本发布后3个月发布。 错误修复版本（2.x.yz），包括针对工具版本的错误修复。这些版本没有确切的发布时间表。 对于每个语言和工具版本，Jetbrains 还会发布几个预览（EAP）版本，供您在正式发布之前尝试新功能。因此不必担心，Kotlin 2.0.10 版本将随后发布。
精选博客 采用 Kotlin Multiplatform 做跨平台 KMP 作为跨平台框架，到底有没有技术生命力，是否要选择它来作为自己未来的发展方向？本文借鉴左耳朵耗子在“如何选择技术”中提出的观点来考虑：
Kotlin Symbol Processing使用与原理剖析 Kotlin Symbol Processing (KSP) 是一个可用于开发轻量级编译器插件的API，与Kotlin Annotation Processing Tool（KAPT）相似，但是却可以更高效地处理注解，并提供更好的性能，使用 KSP 的注释处理器的运行速度最多可达两倍，而且可以支持多平台。
本文详细介绍了 KSP 的使用与从 Kapt 迁移过来的步骤，具体包括如下内容："><meta property="og:type" content="article"><meta property="og:url" content="https://beijing-kug.github.io/news/kotlin-news-2024-06/"><meta property="article:section" content="news"><meta property="article:published_time" content="2024-06-30T00:00:00+00:00"><meta property="article:modified_time" content="2024-06-30T00:00:00+00:00"><meta property="og:site_name" content="北京 KUG"><meta name=twitter:card content="summary"><meta name=twitter:title content="Kotlin 技术月报 | 2024 年 6 月"><meta name=twitter:description content="为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。
月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。
最新动态 KotlinConf 分享回放已全部发布 All KotlinConf Recordings Are Now Available. Enjoy!
现在，您可以在 KotlinConf 官方网站上找到 KotlinConf’24 的所有回放：https://kotlinconf.com/talks/
Kotlin 2.0.20-Beta1 版本已发布 Kotlin 2.0.20-Beta1 版本已发布，更新内容也主要是一些 bug 修复：https://github.com/JetBrains/kotlin/releases
你可能会好奇，为什么 2.0.10 还没有发布就发布了 Kotlin 2.0.20-Beta1? 还会有 2.0.10 吗?
自 Kotlin 2.0.0 起，Jetbrains 发布以下类型的版本：
语言版本（2.x.0），带来语言的重大变化并包括工具更新。每6个月发布一次。 工具版本（2.x.20），在语言版本之间发布，包括工具更新、性能改进和错误修复。在相应的语言版本发布后3个月发布。 错误修复版本（2.x.yz），包括针对工具版本的错误修复。这些版本没有确切的发布时间表。 对于每个语言和工具版本，Jetbrains 还会发布几个预览（EAP）版本，供您在正式发布之前尝试新功能。因此不必担心，Kotlin 2.0.10 版本将随后发布。
精选博客 采用 Kotlin Multiplatform 做跨平台 KMP 作为跨平台框架，到底有没有技术生命力，是否要选择它来作为自己未来的发展方向？本文借鉴左耳朵耗子在“如何选择技术”中提出的观点来考虑：
Kotlin Symbol Processing使用与原理剖析 Kotlin Symbol Processing (KSP) 是一个可用于开发轻量级编译器插件的API，与Kotlin Annotation Processing Tool（KAPT）相似，但是却可以更高效地处理注解，并提供更好的性能，使用 KSP 的注释处理器的运行速度最多可达两倍，而且可以支持多平台。
本文详细介绍了 KSP 的使用与从 Kapt 迁移过来的步骤，具体包括如下内容："><script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"News","item":"https://beijing-kug.github.io/news/"},{"@type":"ListItem","position":2,"name":"Kotlin 技术月报 | 2024 年 6 月","item":"https://beijing-kug.github.io/news/kotlin-news-2024-06/"}]}</script><script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"Kotlin 技术月报 | 2024 年 6 月","name":"Kotlin 技术月报 | 2024 年 6 月","description":"为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。\n月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。\n最新动态 KotlinConf 分享回放已全部发布 All KotlinConf Recordings Are Now Available. Enjoy!\n现在，您可以在 KotlinConf 官方网站上找到 KotlinConf’24 的所有回放：https://kotlinconf.com/talks/\nKotlin 2.0.20-Beta1 版本已发布 Kotlin 2.0.20-Beta1 版本已发布，更新内容也主要是一些 bug 修复：https://github.com/JetBrains/kotlin/releases\n你可能会好奇，为什么 2.0.10 还没有发布就发布了 Kotlin 2.0.20-Beta1? 还会有 2.0.10 吗?\n自 Kotlin 2.0.0 起，Jetbrains 发布以下类型的版本：\n语言版本（2.x.0），带来语言的重大变化并包括工具更新。每6个月发布一次。 工具版本（2.x.20），在语言版本之间发布，包括工具更新、性能改进和错误修复。在相应的语言版本发布后3个月发布。 错误修复版本（2.x.yz），包括针对工具版本的错误修复。这些版本没有确切的发布时间表。 对于每个语言和工具版本，Jetbrains 还会发布几个预览（EAP）版本，供您在正式发布之前尝试新功能。因此不必担心，Kotlin 2.0.10 版本将随后发布。\n精选博客 采用 Kotlin Multiplatform 做跨平台 KMP 作为跨平台框架，到底有没有技术生命力，是否要选择它来作为自己未来的发展方向？本文借鉴左耳朵耗子在“如何选择技术”中提出的观点来考虑：\nKotlin Symbol Processing使用与原理剖析 Kotlin Symbol Processing (KSP) 是一个可用于开发轻量级编译器插件的API，与Kotlin Annotation Processing Tool（KAPT）相似，但是却可以更高效地处理注解，并提供更好的性能，使用 KSP 的注释处理器的运行速度最多可达两倍，而且可以支持多平台。\n本文详细介绍了 KSP 的使用与从 Kapt 迁移过来的步骤，具体包括如下内容：","keywords":["技术月报"],"articleBody":"为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。\n月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。\n最新动态 KotlinConf 分享回放已全部发布 All KotlinConf Recordings Are Now Available. Enjoy!\n现在，您可以在 KotlinConf 官方网站上找到 KotlinConf’24 的所有回放：https://kotlinconf.com/talks/\nKotlin 2.0.20-Beta1 版本已发布 Kotlin 2.0.20-Beta1 版本已发布，更新内容也主要是一些 bug 修复：https://github.com/JetBrains/kotlin/releases\n你可能会好奇，为什么 2.0.10 还没有发布就发布了 Kotlin 2.0.20-Beta1? 还会有 2.0.10 吗?\n自 Kotlin 2.0.0 起，Jetbrains 发布以下类型的版本：\n语言版本（2.x.0），带来语言的重大变化并包括工具更新。每6个月发布一次。 工具版本（2.x.20），在语言版本之间发布，包括工具更新、性能改进和错误修复。在相应的语言版本发布后3个月发布。 错误修复版本（2.x.yz），包括针对工具版本的错误修复。这些版本没有确切的发布时间表。 对于每个语言和工具版本，Jetbrains 还会发布几个预览（EAP）版本，供您在正式发布之前尝试新功能。因此不必担心，Kotlin 2.0.10 版本将随后发布。\n精选博客 采用 Kotlin Multiplatform 做跨平台 KMP 作为跨平台框架，到底有没有技术生命力，是否要选择它来作为自己未来的发展方向？本文借鉴左耳朵耗子在“如何选择技术”中提出的观点来考虑：\nKotlin Symbol Processing使用与原理剖析 Kotlin Symbol Processing (KSP) 是一个可用于开发轻量级编译器插件的API，与Kotlin Annotation Processing Tool（KAPT）相似，但是却可以更高效地处理注解，并提供更好的性能，使用 KSP 的注释处理器的运行速度最多可达两倍，而且可以支持多平台。\n本文详细介绍了 KSP 的使用与从 Kapt 迁移过来的步骤，具体包括如下内容：\n为什么选择KSP KSP能得到什么 KAPT迁移到KSP KSP 的使用 KSP 增量编译 KSP 对 Java 的支持 让 Kotlin Inline 可以构造 NewInstance Kotlin 的 Inline 是一个很重要的能力，它能够极大的简化我们的开发，我们能够使用 Inline 做很多事情，同时 reified 也是一个重要的能力，它能够让类型“实”化，提供更加安全的 as, ::class 等在常规的 Java 泛型中不安全的能力。但 reified 缺失了一个重要的能力：构造一个新对象。\n而在这种能力的缺失下，通常来说我们会使用 ::class.java 拿到对应 Java Class 之后反射 newInstance 来创建对象，我们都知道反射是低效的。\n本文介绍了如何使用 Kotlin 编译器插件实现让 Kotlin Inline 可以构造 NewInstance，更多详细信息可见：https://github.com/zsqw123/kotlin-newInstance\ninline fun \u003creified T : ViewModel\u003e viewModel(): ReadOnlyProperty\u003cActivity, T\u003e { val factory = { newInstance\u003cT\u003e() } return ReadOnlyProperty { _, _ -\u003e factory() } } class MyActivity : Activity() { val fooViewModel: FooViewModel by viewModel() } 联合类型可能为类型系统带来的问题 The problem of union types for type systems\nKotlin 将引入一种有限形式的联合类型: Union types for errors。很多人会好奇，为什么 Kotlin 不引入完整的联合类型支持呢？\n联合类型（如 Int | String）可以提高代码的表达能力，但也增加了类型系统的复杂性，尤其是在处理泛型时。事实上，在存在联合类型时，类型推导是 NP-hard 的。更多详细信息可见：Revamping and Extending Kotlin’s Type System | Ross Tate\n工程化视角的 Kotlin Multiplatform核心解读及优化 本文以工程化视角介绍了哔哩哔哩技术团队在使用 Kotlin Multiplatform 技术时的实践与优化方案。\n文章首先介绍了Kotlin作为编程语言的特点，包括默认可见性为public、编译器的功能，以及插件系统在扩展语言能力方面的作用。\n同时文章总结了 KMP 在工程化中的应用和挑战，并提出了B站针对KMP的优化实践，包括构建系统从Gradle替换为Bazel，以及针对Kotlin-Core的能力复原和生态融合。文章指出，虽然这一过程带来了额外的学习和维护成本，但整体上提高了工程的可靠性和效率。\n精选视频 Kotlin 2.0 都有哪些新特性？ Kotlin 2.0 : K2 编译器的更新\n本视频细致的讲解了 Kotlin 2.0 都做了哪些更新，带来了哪些新特性。具体包括以下内容：\nKotlin K2 编译器有哪些更新？ Kotlin 跨平台有哪些更新？ Gradle 相关有哪些更新? Kotlin 标准库有哪些更新？ 如何让 Compose 运行到智能台灯开关上？ Compose UI for… a light switch | Jake Wharton\nCompose UI 可以运行在安卓、iOS、桌面和网页上，但在这次分享中，Jake Wharton 讲述了如何在基于嵌入式 Linux 的智能灯开关上运行 Compose UI。\n本次分享详细介绍了发现设备后门的过程，如何在设备上运行自定义软件，如何在嵌入式 Linux 上运行 Kotlin 和 Compose UI，最后为开关开发我们自己的 App。\n社区活动 KotlinConf Global 相关活动 随着 KotlinConf 活动圆满落幕，全国各地，包括北京、上海、深圳等城市的 KotlinConf Global 分会场活动也接踵而至。以下是一些活动的链接。\n活动回顾 | 2024 KotlinConf Global 北京分享会 深圳线下活动｜KotlinConf’24 Global 上海线下活动｜KotlinConf Global Shanghai 2024 ","wordCount":"271","inLanguage":"en","datePublished":"2024-06-30T00:00:00Z","dateModified":"2024-06-30T00:00:00Z","author":{"@type":"Person","name":"beijing-kug"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://beijing-kug.github.io/news/kotlin-news-2024-06/"},"publisher":{"@type":"Organization","name":"北京 KUG","logo":{"@type":"ImageObject","url":"https://beijing-kug.github.io/kug-logo.png"}}}</script></head><body id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><header class=header><nav class=nav><div class=logo><a href=https://beijing-kug.github.io/ accesskey=h title="北京 KUG (Alt + H)">北京 KUG</a><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)"><svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=https://beijing-kug.github.io/events/ title=分享会><span>分享会</span></a></li><li><a href=https://mp.weixin.qq.com/s/GNlbZ6xpCGB1EGML_W4kOg title="加入 KUG"><span>加入 KUG</span></a></li><li><a href=https://www.kotlincn.net/ title=中文文档><span>中文文档</span></a></li><li><a href=https://beijing-kug.github.io/news/ title=技术月报><span>技术月报</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=https://beijing-kug.github.io/>Home</a>&nbsp;»&nbsp;<a href=https://beijing-kug.github.io/news/>News</a></div><h1 class=post-title>Kotlin 技术月报 | 2024 年 6 月</h1><div class=post-meta><span title='2024-06-30 00:00:00 +0000 UTC'>June 30, 2024</span>&nbsp;·&nbsp;beijing-kug</div></header><div class=post-content><p>为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态，我们决定使用月报的形式，整理展示最近一个月的 Kotlin 技术动态。</p><p>月报的主要内容包括：整理展示最近一个月的最新技术动态，精选博客，精选视频以及社区活动等方面的信息。</p><h2 id=最新动态>最新动态<a hidden class=anchor aria-hidden=true href=#最新动态>#</a></h2><h3 id=kotlinconf-分享回放已全部发布>KotlinConf 分享回放已全部发布<a hidden class=anchor aria-hidden=true href=#kotlinconf-分享回放已全部发布>#</a></h3><p><a href=https://blog.jetbrains.com/kotlin/2024/06/kotlinconf24-recordings/>All KotlinConf Recordings Are Now Available. Enjoy!</a></p><p>现在，您可以在 KotlinConf 官方网站上找到 KotlinConf’24 的所有回放：<a href=https://kotlinconf.com/talks/>https://kotlinconf.com/talks/</a></p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/june/p21.jpg alt></p><h3 id=kotlin-2020-beta1-版本已发布>Kotlin 2.0.20-Beta1 版本已发布<a hidden class=anchor aria-hidden=true href=#kotlin-2020-beta1-版本已发布>#</a></h3><p>Kotlin 2.0.20-Beta1 版本已发布，更新内容也主要是一些 bug 修复：<a href=https://github.com/JetBrains/kotlin/releases>https://github.com/JetBrains/kotlin/releases</a></p><p>你可能会好奇，为什么 2.0.10 还没有发布就发布了 Kotlin 2.0.20-Beta1? 还会有 2.0.10 吗?</p><p>自 Kotlin 2.0.0 起，Jetbrains 发布以下类型的版本：</p><ul><li>语言版本（2.x.0），带来语言的重大变化并包括工具更新。每6个月发布一次。</li><li>工具版本（2.x.20），在语言版本之间发布，包括工具更新、性能改进和错误修复。在相应的语言版本发布后3个月发布。</li><li>错误修复版本（2.x.yz），包括针对工具版本的错误修复。这些版本没有确切的发布时间表。</li></ul><p>对于每个语言和工具版本，Jetbrains 还会发布几个预览（EAP）版本，供您在正式发布之前尝试新功能。因此不必担心，Kotlin 2.0.10 版本将随后发布。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/june/p20.jpg alt></p><h2 id=精选博客>精选博客<a hidden class=anchor aria-hidden=true href=#精选博客>#</a></h2><h3 id=采用-kotlin-multiplatform-做跨平台httpsjuejincnpost7375586227984711689><a href=https://juejin.cn/post/7375586227984711689>采用 Kotlin Multiplatform 做跨平台</a><a hidden class=anchor aria-hidden=true href=#采用-kotlin-multiplatform-做跨平台httpsjuejincnpost7375586227984711689>#</a></h3><p>KMP 作为跨平台框架，到底有没有技术生命力，是否要选择它来作为自己未来的发展方向？本文借鉴左耳朵耗子在“如何选择技术”中提出的观点来考虑：</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/june/p22.png alt></p><h3 id=kotlin-symbol-processing使用与原理剖析httpsjuejincnpost7378079761817862181><a href=https://juejin.cn/post/7378079761817862181>Kotlin Symbol Processing使用与原理剖析</a><a hidden class=anchor aria-hidden=true href=#kotlin-symbol-processing使用与原理剖析httpsjuejincnpost7378079761817862181>#</a></h3><p>Kotlin Symbol Processing (KSP) 是一个可用于开发轻量级编译器插件的API，与Kotlin Annotation Processing Tool（KAPT）相似，但是却可以更高效地处理注解，并提供更好的性能，使用 KSP 的注释处理器的运行速度最多可达两倍，而且可以支持多平台。</p><p>本文详细介绍了 KSP 的使用与从 Kapt 迁移过来的步骤，具体包括如下内容：</p><ul><li>为什么选择KSP</li><li>KSP能得到什么</li><li>KAPT迁移到KSP</li><li>KSP 的使用</li><li>KSP 增量编译</li><li>KSP 对 Java 的支持</li></ul><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/june/p23.jpg alt></p><h3 id=让-kotlin-inline-可以构造-newinstancehttpsjuejincnpost7382931501610647592><a href=https://juejin.cn/post/7382931501610647592>让 Kotlin Inline 可以构造 NewInstance</a><a hidden class=anchor aria-hidden=true href=#让-kotlin-inline-可以构造-newinstancehttpsjuejincnpost7382931501610647592>#</a></h3><p>Kotlin 的 Inline 是一个很重要的能力，它能够极大的简化我们的开发，我们能够使用 Inline 做很多事情，同时 reified 也是一个重要的能力，它能够让类型“实”化，提供更加安全的 as, ::class 等在常规的 Java 泛型中不安全的能力。但 reified 缺失了一个重要的能力：构造一个新对象。</p><p>而在这种能力的缺失下，通常来说我们会使用 ::class.java 拿到对应 Java Class 之后反射 newInstance 来创建对象，我们都知道反射是低效的。</p><p>本文介绍了如何使用 Kotlin 编译器插件实现让 Kotlin Inline 可以构造 NewInstance，更多详细信息可见：<a href=https://github.com/zsqw123/kotlin-newInstance>https://github.com/zsqw123/kotlin-newInstance</a></p><div class=highlight><pre tabindex=0 class=chroma><code class=language-kotlin data-lang=kotlin><span class=line><span class=cl><span class=k>inline</span> <span class=k>fun</span> <span class=p>&lt;</span><span class=k>reified</span> <span class=nc>T</span> <span class=p>:</span> <span class=nc>ViewModel</span><span class=p>&gt;</span> <span class=nf>viewModel</span><span class=p>():</span> <span class=n>ReadOnlyProperty</span><span class=p>&lt;</span><span class=n>Activity</span><span class=p>,</span> <span class=n>T</span><span class=p>&gt;</span> <span class=p>{</span>
</span></span><span class=line><span class=cl>    <span class=k>val</span> <span class=py>factory</span> <span class=p>=</span> <span class=p>{</span> <span class=n>newInstance</span><span class=p>&lt;</span><span class=n>T</span><span class=p>&gt;()</span> <span class=p>}</span>
</span></span><span class=line><span class=cl>    <span class=k>return</span> <span class=n>ReadOnlyProperty</span> <span class=p>{</span> <span class=n>_</span><span class=p>,</span> <span class=n>_</span> <span class=o>-&gt;</span> <span class=n>factory</span><span class=p>()</span> <span class=p>}</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span><span class=line><span class=cl>
</span></span><span class=line><span class=cl><span class=k>class</span> <span class=nc>MyActivity</span> <span class=p>:</span> <span class=n>Activity</span><span class=p>()</span> <span class=p>{</span>
</span></span><span class=line><span class=cl>    <span class=k>val</span> <span class=py>fooViewModel</span><span class=p>:</span> <span class=n>FooViewModel</span> <span class=k>by</span> <span class=n>viewModel</span><span class=p>()</span>
</span></span><span class=line><span class=cl><span class=p>}</span>
</span></span></code></pre></div><h3 id=联合类型可能为类型系统带来的问题>联合类型可能为类型系统带来的问题<a hidden class=anchor aria-hidden=true href=#联合类型可能为类型系统带来的问题>#</a></h3><p><a href=https://kt.academy/article/union-types-into>The problem of union types for type systems</a></p><p>Kotlin 将引入一种有限形式的联合类型: Union types for errors。很多人会好奇，为什么 Kotlin 不引入完整的联合类型支持呢？</p><p>联合类型（如 Int | String）可以提高代码的表达能力，但也增加了类型系统的复杂性，尤其是在处理泛型时。事实上，在存在联合类型时，类型推导是 NP-hard 的。更多详细信息可见：<a href="https://www.youtube.com/watch?v=3uNpmhHwkuQ&amp;t=182s">Revamping and Extending Kotlin&rsquo;s Type System | Ross Tate</a></p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/june/p24.webp alt></p><h3 id=工程化视角的-kotlin-multiplatform核心解读及优化httpsmpweixinqqcomsnrmwpsglfgvros1lrvuaiw><a href=https://mp.weixin.qq.com/s/nRmwpSGlFgvROs1lRVuAIw>工程化视角的 Kotlin Multiplatform核心解读及优化</a><a hidden class=anchor aria-hidden=true href=#工程化视角的-kotlin-multiplatform核心解读及优化httpsmpweixinqqcomsnrmwpsglfgvros1lrvuaiw>#</a></h3><p>本文以工程化视角介绍了哔哩哔哩技术团队在使用 Kotlin Multiplatform 技术时的实践与优化方案。</p><p>文章首先介绍了Kotlin作为编程语言的特点，包括默认可见性为public、编译器的功能，以及插件系统在扩展语言能力方面的作用。</p><p>同时文章总结了 KMP 在工程化中的应用和挑战，并提出了B站针对KMP的优化实践，包括构建系统从Gradle替换为Bazel，以及针对Kotlin-Core的能力复原和生态融合。文章指出，虽然这一过程带来了额外的学习和维护成本，但整体上提高了工程的可靠性和效率。</p><h2 id=精选视频>精选视频<a hidden class=anchor aria-hidden=true href=#精选视频>#</a></h2><h3 id=kotlin-20-都有哪些新特性>Kotlin 2.0 都有哪些新特性？<a hidden class=anchor aria-hidden=true href=#kotlin-20-都有哪些新特性>#</a></h3><p><a href=https://www.bilibili.com/video/BV19S411w7uc/>Kotlin 2.0 : K2 编译器的更新</a></p><p>本视频细致的讲解了 Kotlin 2.0 都做了哪些更新，带来了哪些新特性。具体包括以下内容：</p><ul><li>Kotlin K2 编译器有哪些更新？</li><li>Kotlin 跨平台有哪些更新？</li><li>Gradle 相关有哪些更新?</li><li>Kotlin 标准库有哪些更新？</li></ul><h3 id=如何让-compose-运行到智能台灯开关上>如何让 Compose 运行到智能台灯开关上？<a hidden class=anchor aria-hidden=true href=#如何让-compose-运行到智能台灯开关上>#</a></h3><p><a href="https://www.youtube.com/watch?v=D0P5Lb-2uCY&amp;t=269s">Compose UI for&mldr; a light switch | Jake Wharton</a></p><p>Compose UI 可以运行在安卓、iOS、桌面和网页上，但在这次分享中，Jake Wharton 讲述了如何在基于嵌入式 Linux 的智能灯开关上运行 Compose UI。</p><p>本次分享详细介绍了发现设备后门的过程，如何在设备上运行自定义软件，如何在嵌入式 Linux 上运行 Kotlin 和 Compose UI，最后为开关开发我们自己的 App。</p><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/june/p26.png alt></p><h2 id=社区活动>社区活动<a hidden class=anchor aria-hidden=true href=#社区活动>#</a></h2><h3 id=kotlinconf-global-相关活动>KotlinConf Global 相关活动<a hidden class=anchor aria-hidden=true href=#kotlinconf-global-相关活动>#</a></h3><p>随着 KotlinConf 活动圆满落幕，全国各地，包括北京、上海、深圳等城市的 KotlinConf Global 分会场活动也接踵而至。以下是一些活动的链接。</p><ul><li><a href=https://mp.weixin.qq.com/s/4gl1fg0Gt0HopPPN1PT16w>活动回顾 | 2024 KotlinConf Global 北京分享会</a></li><li><a href=https://mp.weixin.qq.com/s/sa0iHGbSTyJMExgT05p1pA>深圳线下活动｜KotlinConf’24 Global</a></li><li><a href=https://mp.weixin.qq.com/s/rRupsWHvxUqR_8Yx6M-XFg>上海线下活动｜KotlinConf Global Shanghai 2024</a></li></ul><p><img loading=lazy src=https://raw.gitmirror.com/RicardoJiang/resource/main/2024/may/kotlinconf-global.webp alt></p></div><footer class=post-footer><ul class=post-tags><li><a href=https://beijing-kug.github.io/tags/%E6%8A%80%E6%9C%AF%E6%9C%88%E6%8A%A5/>技术月报</a></li></ul><nav class=paginav><a class=prev href=https://beijing-kug.github.io/news/kotlin-news-2024-07/><span class=title>« Prev</span><br><span>Kotlin 技术月报 | 2024 年 7 月</span></a>
<a class=next href=https://beijing-kug.github.io/news/kotlin-news-2024-05/><span class=title>Next »</span><br><span>Kotlin 技术月报 | 2024 年 5 月</span></a></nav><div class=share-buttons><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 6 月 on twitter" href="https://twitter.com/intent/tweet/?text=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%206%20%e6%9c%88&amp;url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f&amp;hashtags=%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM195.519 424.544c135.939.0 210.268-112.643 210.268-210.268.0-3.218.0-6.437-.153-9.502 14.406-10.421 26.973-23.448 36.935-38.314-13.18 5.824-27.433 9.809-42.452 11.648 15.326-9.196 26.973-23.602 32.49-40.92-14.252 8.429-30.038 14.56-46.896 17.931-13.487-14.406-32.644-23.295-53.946-23.295-40.767.0-73.87 33.104-73.87 73.87.0 5.824.613 11.494 1.992 16.858-61.456-3.065-115.862-32.49-152.337-77.241-6.284 10.881-9.962 23.601-9.962 37.088.0 25.594 13.027 48.276 32.95 61.456-12.107-.307-23.448-3.678-33.41-9.196v.92c0 35.862 25.441 65.594 59.311 72.49-6.13 1.686-12.72 2.606-19.464 2.606-4.751.0-9.348-.46-13.946-1.38 9.349 29.426 36.628 50.728 68.965 51.341-25.287 19.771-57.164 31.571-91.8 31.571-5.977.0-11.801-.306-17.625-1.073 32.337 21.15 71.264 33.41 112.95 33.41z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 6 月 on linkedin" href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f&amp;title=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%206%20%e6%9c%88&amp;summary=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%206%20%e6%9c%88&amp;source=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM160.461 423.278V197.561h-75.04v225.717h75.04zm270.539.0V293.839c0-69.333-37.018-101.586-86.381-101.586-39.804.0-57.634 21.891-67.617 37.266v-31.958h-75.021c.995 21.181.0 225.717.0 225.717h75.02V297.222c0-6.748.486-13.492 2.474-18.315 5.414-13.475 17.767-27.434 38.494-27.434 27.135.0 38.007 20.707 38.007 51.037v120.768H431zM123.448 88.722C97.774 88.722 81 105.601 81 127.724c0 21.658 16.264 39.002 41.455 39.002h.484c26.165.0 42.452-17.344 42.452-39.002-.485-22.092-16.241-38.954-41.943-39.002z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 6 月 on reddit" href="https://reddit.com/submit?url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f&title=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%206%20%e6%9c%88"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM446 265.638c0-22.964-18.616-41.58-41.58-41.58-11.211.0-21.361 4.457-28.841 11.666-28.424-20.508-67.586-33.757-111.204-35.278l18.941-89.121 61.884 13.157c.756 15.734 13.642 28.29 29.56 28.29 16.407.0 29.706-13.299 29.706-29.701.0-16.403-13.299-29.702-29.706-29.702-11.666.0-21.657 6.792-26.515 16.578l-69.105-14.69c-1.922-.418-3.939-.042-5.585 1.036-1.658 1.073-2.811 2.761-3.224 4.686l-21.152 99.438c-44.258 1.228-84.046 14.494-112.837 35.232-7.468-7.164-17.589-11.591-28.757-11.591-22.965.0-41.585 18.616-41.585 41.58.0 16.896 10.095 31.41 24.568 37.918-.639 4.135-.99 8.328-.99 12.576.0 63.977 74.469 115.836 166.33 115.836s166.334-51.859 166.334-115.836c0-4.218-.347-8.387-.977-12.493 14.564-6.47 24.735-21.034 24.735-38.001zM326.526 373.831c-20.27 20.241-59.115 21.816-70.534 21.816-11.428.0-50.277-1.575-70.522-21.82-3.007-3.008-3.007-7.882.0-10.889 3.003-2.999 7.882-3.003 10.885.0 12.777 12.781 40.11 17.317 59.637 17.317 19.522.0 46.86-4.536 59.657-17.321 3.016-2.999 7.886-2.995 10.885.008 3.008 3.011 3.003 7.882-.008 10.889zm-5.23-48.781c-16.373.0-29.701-13.324-29.701-29.698.0-16.381 13.328-29.714 29.701-29.714 16.378.0 29.706 13.333 29.706 29.714.0 16.374-13.328 29.698-29.706 29.698zM160.91 295.348c0-16.381 13.328-29.71 29.714-29.71 16.369.0 29.689 13.329 29.689 29.71.0 16.373-13.32 29.693-29.689 29.693-16.386.0-29.714-13.32-29.714-29.693z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 6 月 on facebook" href="https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H342.978V319.085h66.6l12.672-82.621h-79.272v-53.617c0-22.603 11.073-44.636 46.58-44.636H425.6v-70.34s-32.71-5.582-63.982-5.582c-65.288.0-107.96 39.569-107.96 111.204v62.971h-72.573v82.621h72.573V512h-191.104c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 6 月 on whatsapp" href="https://api.whatsapp.com/send?text=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%206%20%e6%9c%88%20-%20https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f"><svg viewBox="0 0 512 512"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zm-58.673 127.703c-33.842-33.881-78.847-52.548-126.798-52.568-98.799.0-179.21 80.405-179.249 179.234-.013 31.593 8.241 62.428 23.927 89.612l-25.429 92.884 95.021-24.925c26.181 14.28 55.659 21.807 85.658 21.816h.074c98.789.0 179.206-80.413 179.247-179.243.018-47.895-18.61-92.93-52.451-126.81zM263.976 403.485h-.06c-26.734-.01-52.954-7.193-75.828-20.767l-5.441-3.229-56.386 14.792 15.05-54.977-3.542-5.637c-14.913-23.72-22.791-51.136-22.779-79.287.033-82.142 66.867-148.971 149.046-148.971 39.793.014 77.199 15.531 105.329 43.692 28.128 28.16 43.609 65.592 43.594 105.4-.034 82.149-66.866 148.983-148.983 148.984zm81.721-111.581c-4.479-2.242-26.499-13.075-30.604-14.571-4.105-1.495-7.091-2.241-10.077 2.241-2.986 4.483-11.569 14.572-14.182 17.562-2.612 2.988-5.225 3.364-9.703 1.12-4.479-2.241-18.91-6.97-36.017-22.23C231.8 264.15 222.81 249.484 220.198 245s-.279-6.908 1.963-9.14c2.016-2.007 4.48-5.232 6.719-7.847 2.24-2.615 2.986-4.484 4.479-7.472 1.493-2.99.747-5.604-.374-7.846-1.119-2.241-10.077-24.288-13.809-33.256-3.635-8.733-7.327-7.55-10.077-7.688-2.609-.13-5.598-.158-8.583-.158-2.986.0-7.839 1.121-11.944 5.604-4.105 4.484-15.675 15.32-15.675 37.364.0 22.046 16.048 43.342 18.287 46.332 2.24 2.99 31.582 48.227 76.511 67.627 10.685 4.615 19.028 7.371 25.533 9.434 10.728 3.41 20.492 2.929 28.209 1.775 8.605-1.285 26.499-10.833 30.231-21.295 3.732-10.464 3.732-19.431 2.612-21.298-1.119-1.869-4.105-2.99-8.583-5.232z"/></svg></a><a target=_blank rel="noopener noreferrer" aria-label="share Kotlin 技术月报 | 2024 年 6 月 on telegram" href="https://telegram.me/share/url?text=Kotlin%20%e6%8a%80%e6%9c%af%e6%9c%88%e6%8a%a5%20%7c%202024%20%e5%b9%b4%206%20%e6%9c%88&amp;url=https%3a%2f%2fbeijing-kug.github.io%2fnews%2fkotlin-news-2024-06%2f"><svg viewBox="2 2 28 28"><path d="M26.49 29.86H5.5a3.37 3.37.0 01-2.47-1 3.35 3.35.0 01-1-2.47V5.48A3.36 3.36.0 013 3 3.37 3.37.0 015.5 2h21A3.38 3.38.0 0129 3a3.36 3.36.0 011 2.46V26.37a3.35 3.35.0 01-1 2.47 3.38 3.38.0 01-2.51 1.02zm-5.38-6.71a.79.79.0 00.85-.66L24.73 9.24a.55.55.0 00-.18-.46.62.62.0 00-.41-.17q-.08.0-16.53 6.11a.59.59.0 00-.41.59.57.57.0 00.43.52l4 1.24 1.61 4.83a.62.62.0 00.63.43.56.56.0 00.4-.17L16.54 20l4.09 3A.9.9.0 0021.11 23.15zM13.8 20.71l-1.21-4q8.72-5.55 8.78-5.55c.15.0.23.0.23.16a.18.18.0 010 .06s-2.51 2.3-7.52 6.8z"/></svg></a></div></footer></article></main><footer class=footer><span>&copy; 2025 <a href=https://beijing-kug.github.io/>北京 KUG</a></span>
<span>Powered by
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
        <a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg></a><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script></body></html>